<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body></body>
  <script>
    // 需求：公司的年终奖是根据员工的工资和绩效来考核的，绩效为A的人，年终奖为工资的四倍，
    // 绩效为B的人，年终奖为工资的三倍，绩效为C的人，年终奖为工资的2倍

    // 常规写法：
    /*  function finalSalary(salary,level) { 
      if(level === "A"){
        return salary*4;
      }else if(level === "B"){
        return salary*3;
      }else if(level === "C"){
        return salary*2;
      }
    } */

    // console.log(finalSalary(5000, "B"));

    /* 以上代码在处理工程化项目中可能会出现以下几个问题：
        1.如果增加条件判断，比如增加D，E，F等级别，上面的代码可能需要重写----不利于功能扩展
        2.如果某个条件的算法与其他的不一样，这时也需要重写代码，这就意味着上面代码不利于复用
     */

    //  采用策略模式实现上面的需求
    var obj = {
      //定义对象，用于封装算法
      A: function (salary) {
        return salary * 4;
      },
      B: function (salary) {
        return salary * 3;
      },
      C: function (salary) {
        return salary * 2;
      },
    };

    var finalSalary = function (salary, level) {
      return obj[level](salary);
    };

    // 扩展(增加条件)
    obj.D = function (salary) {
      return "没有这个算法"; //修改算法
    };
    // 修改算法
    obj.A = function (salary) {
      return salary * 4 - 1000;
    };

    console.log(finalSalary(5000, "D"));
    console.log(finalSalary(5000, "A"));
  </script>
</html>
